import store from "@/core/store.js"
import {getRnd} from "@/utils/util"
import TextEncoder from '@/utils/encoder.js'
export default {
	data() {
		return {
			socketOpen: false, // WebSocket连接状态
			heart: '',
			heartBeatFailCount: 0,
			heartBeatTimeOut: '',
		};
	},
	reset() {
		if (store.state.userInfo.aid) {
			if(this.socketOpen) return;
			this.connectWebSocket()
		}
	},
	// #ifdef MP-WEIXIN 
	/**
	 * 连接WebSocket服务器
	 */
	connectWebSocket: function() {
		var that = this
		wx.connectSocket({
			url: `${store.state.socketUrl}${store.state.userInfo.aid}`,
			success: function(res) {
				console.log('WebSocket连接成功')
			},
			fail: function(res) {
				console.log('WebSocket连接失败:', res)
			}
		})
		wx.onSocketOpen(function(res) {
			console.log('WebSocket连接已打开')
			that.socketOpen = true
			that.startHeartBeat();
		})
		wx.onSocketError(function(res) {
			that.socketOpen = false
			clearTimeout(that.heartBeatTimeOut)
			console.log('WebSocket连接打开失败:', res)
		})
		wx.onSocketClose(function(res) {
			console.log('WebSocket连接已关闭:', res)
			that.socketOpen = false
			clearTimeout(that.heartBeatTimeOut)
		})
		wx.onSocketMessage(function(res) {
			let data = JSON.parse(res.data)
			if(data.code==20030){
				store.commit("setImList",data.cnt)
				store.commit("setIsMessage",true)
				if(data.cnt.sessId && data.cnt.sessId==store.state.sessId){
					//通知为已读
					that.sendMessage2(data.cnt.sessId);
				}
			}
			if(data.code==20032){
				console.log("对方已读了............")
				store.commit("setIsRead",data.cnt)
			}
			console.log('接收到服务器发送的数据:', res.data)
		})
	},
	
	sendMessage2: function(sessId,code = "20021", timeStamp = new Date().getTime()+"") {
		if (!this.socketOpen) {
			wx.showToast({
				title: 'WebSocket未连接',
				icon: 'none'
			})
			return
		}
		var mysessId=sessId.toString();
	
		let data1 = {
			code,
			sessId:mysessId,
			timeStamp
		}
		this.sendSocketMessage({
			msg: data1,
			success: function(res) {
				console.log('发送成功');
			},
			fail: function(res) {
				console.log('发送失败');
			},
		})
	
	},
	
	/**
	 * 发送消息
	 */
	sendMessage: function(sessId, cnt,roleType,isFirst ,code = "20020", timeStamp = new Date().getTime()+"") {
		if (!this.socketOpen) {
			wx.showToast({
				title: 'WebSocket未连接',
				icon: 'none'
			})
			return
		}
		var mysessId=sessId.toString();
	
		var data = {
			code,
			sessId:mysessId,
			roleType,
			isFirst,
			cnt,
			timeStamp
		}

		this.sendSocketMessage({
			msg: data,
			success: function(res) {
				if(data.code=="20020"){
					store.commit("setImList",{
						aid:store.state.userInfo.aid,
						cnt:data.cnt,
						isBaoxian:0,
						isJiaohuan:0,
						isRead:0,
						isInfo:0,
						sessId:data.sessId,
						id:getRnd(10000,1000000),
					})
				}
				console.log('发送成功');
			},
			fail: function(res) {
				console.log('发送失败');
			},
		})

	},
	/**
	 * 发送WebSocket消息
	 */
	sendSocketMessage: function(message) {
		if (this.socketOpen) {
			// let textEncoder = new TextEncoder()
			// const arrayBuffer = new Uint8Array(message.msg)
			let str =  JSON.stringify(message.msg)
			wx.sendSocketMessage({
				data: str,
				success: function(res) {
					if (message) {
						message.success && message.success(res);
					}
				},
				fail: function(res) {
					if (message) {
						message.fail && message.fail(res);
					}
				}
			})
		} else {
			wx.showToast({
				title: 'WebSocket未连接',
				icon: 'none'
			})
		}
	},



	// 开始心跳
	startHeartBeat: function() {
		console.log('socket开始心跳')
		var self = this;
		self.heart = 'heart';
		self.heartBeat();
	},

	// 结束心跳
	stopHeartBeat: function() {
		console.log('socket结束心跳')
		var self = this;
		self.heart = '';
		if (self.heartBeatTimeOut) {
			clearTimeout(self.heartBeatTimeOut);
			self.heartBeatTimeOut = null;
		}
		if (self.connectSocketTimeOut) {
			clearTimeout(self.connectSocketTimeOut);
			self.connectSocketTimeOut = null;
		}
	},

	// 心跳
	heartBeat: function() {
		var self = this;
		if (!self.heart) {
			return;
		}
		self.sendSocketMessage({
			msg: {type: "ping",timestamp: new Date().getTime()},
			success: function(res) {
				console.log('socket心跳成功');
				if (self.heart) {
					self.heartBeatTimeOut = setTimeout(() => {
						self.heartBeat();
					}, 30000);
				}
			},
			fail: function(res) {
				console.log('socket心跳失败');
				if (self.heartBeatFailCount > 2) {
					// 重连
					self.connectSocket();
				}
				if (self.heart) {
					self.heartBeatTimeOut = setTimeout(() => {
						self.heartBeat();
					}, 30000);
				}
				self.heartBeatFailCount++;
			},
		})
	},
	onUnload: function() {
		wx.closeSocket() // 关闭WebSocket连接
	},
	// #endif
};













// export class Socket {
// 	data() {
// 		return {
// 			socket:'',
// 			socketTimer:''
// 		}
// 	},

//     // 建立连接
//     getJoin(aId: string) {

//         if (this.socket && this.socket.readyState == 1) {
//             return false;
//         }


//         this.socket = new WebSocket(`${store.state.socketUrl}${aId}`)

//         this.socket.onopen = (event) => {
//             console.log("WebSocket opened.");

//             var heartBeat = {
//                 type: "ping",
//                 timestamp: new Date().getTime()
//             }
//             //定时发送心跳包
//             this.socketTimer = setInterval(() => {
//                 this.socket.send(JSON.stringify(heartBeat));
//                 console.log(heartBeat)
//             }, 30000);
//         };

//         /* 
//             code：20021  有新的用户会话
//             code：20022  更新当前排队人数
//             code：20023  会话结束
//             code：20024  会话被删除
//             code:20025   退出账号
//             code: 20031  主管推送待分配消息

//             code: 30021  专家新的会话邀请

//             code:40001   用户退出推送消息
//             code:40002   用户离开推送消息
//             code:40003   用户离开转在线推送消息

//         */
//         this.socket.onmessage = function (event) {
//             console.log("Received message: " + event.data);
//             try {
//                 const data = JSON.parse(event.data);
//                 console.log(data)
//                 const sessId = data.sessId || (data.data ? data.data.sessId : "") || "";
//                 if (data.code == 20021) {
//                     console.log("有新的用户会话")
//                     notice.getNoticeInfo();
//                     setTimeout(() => {
//                         eventBus.emit("groupNew", true)
//                         Tim.addGroup(sessId)
//                         notice.watchServerDai(sessId)
//                     }, 200)
//                 } else if (data.code == 20022) {
//                     console.log("更新当前排队人数")
//                     eventBus.emit("queueNum", data)
//                 } else if (data.code == 20023) {
//                     setTimeout(() => {
//                         console.log("结束会话")
//                         eventBus.emit("endChat", sessId)
//                         notice.clearAll(sessId)
//                     }, 700)
//                 } else if (data.code == 20031) {
//                     setTimeout(() => {
//                         Tim.addGroup(sessId)
//                         notice.watchAdmin(sessId)
//                         eventBus.emit("waitAssignChat", data.data)
//                     }, 10)
//                 } else if (data.code == 20024) {
//                     notice.clearAll(sessId)
//                     if (sessId == store.userItem.sessId) {
//                         store.$patch((state) => {
//                             state.userItem = {}
//                             window.location.reload();
//                         })
//                     }
//                 } else if (data.code == 30021) {
//                     setTimeout(() => {
//                         Tim.addGroup(sessId);
//                         // notice.watchZhuanjiaInvite(sessId, store.userId);
//                     }, 200)
//                 } else if (data.code > 40000 && data.code < 40010) {
//                     eventBus.emit("setStatus", { code: data.code, type: data.type })
//                 } else if (data.code == 20016) {
//                     if (store.userItem.sessId == sessId) {
//                         store.userItem = data.data;
//                     }
//                     eventBus.emit("20016", data.code)
//                 } else if (data.code == 20025) {
//                     console.log("退出")
//                     _this.loginOutHandler();
//                 }
//                 else {
//                     console.log("其他")
//                 }
//             } catch (e) {
//                 console.log(e)
//             }

//         };

//         let _this = this
//         this.socket.onclose = function (event) {
//             console.log("WebSocket closed.");
//             clearInterval(_this.socketTimer)
//             // _this.reset()
//             // console.log(_this.socket)
//             _this.reset();
//         };

//         this.socket.onerror = function (event) {
//             console.log("WebSocket error.");
//             clearInterval(_this.socketTimer)
//             // _this.reset()
//             // _this.getJoin(userId,roleType)
//             _this.socket.close();
//         };
//     }

//     loginOutHandler() {
//         const router = useRouter();
//         const store = useIndexStore();
//         store.$reset()
//         logout();
//         this.socket.close();
//         router.push("/login")
//     }

//     // 刷新重连
//     reset() {
//         const store = useIndexStore();
//         if (store.userInfo.aid) {
//             console.log("正在重新连接")
//             // this.socket.close();
//             setTimeout(() => {
//                 this.getJoin(store.userInfo.aid)
//             }, 1000)
//         }
//     }

//     // 关闭
//     close() {
//         if (this.socket) {
//             this.socket.close();
//         }
//     }

//     // 发送消息
//     async sendTipMessage(cnt, sessId, time?: any) {
//         console.log("发送系统消息------》" + cnt)
//         console.log(sessId)
//         console.log(cnt, sessId)
//         const result: any = await getIsMessageSend(encodeURIComponent(cnt) + sessId + "_" + time)
//         if (result.code == 20000) {
//             if (result.data.isOk) {
//                 const store = useIndexStore();
//                 const res = await Tim.sendMessageCustom(cnt, "tip", sessId)
//                 await sendMessageServer({
//                     cntType: "1",
//                     content: cnt,
//                     roleType: "3",
//                     sessId: sessId,
//                     nickname: store.userItem.name,
//                 })
//                 if (res) {
//                     eventBus.emit("receiveMessage", res)
//                 }
//             } else {
//                 // setTimeout(() => {
//                 //     window.location.reload()
//                 // }, 500)
//             }
//         }
//     }
// }

// export default new Socket()